The objective of this notebook is to analyze the subjective bias of news from the main Brazilian newspapers….

require(GGally, quietly = TRUE)
require(reshape2, quietly = TRUE)
require(tidyverse, quietly = TRUE, warn.conflicts = FALSE)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.2.1 ──
## ✔ tibble  2.1.1       ✔ purrr   0.3.2  
## ✔ tidyr   0.8.3       ✔ dplyr   0.8.0.1
## ✔ readr   1.3.1       ✔ stringr 1.4.0  
## ✔ tibble  2.1.1       ✔ forcats 0.4.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
library(ggfortify)
library(cluster)
library(ggdendro)
library(broom)
library(tidyverse)
library(plotly)
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
options(warn=-1) # ignore warns
data <- read.csv("data/news_bias_formatted.csv",encoding="UTF-8")

data <- data %>%
    filter(arg >= 0, sen >= 0, val >= 0, pre >= 0, mod >= 0)

Qual a representatividade de cada dimensão para as notícias?

Análise por redução de dimensionalidade

O gráfico abaixo exibe a relação entre a variância acumulada nos PCAs com a variância total existente nos dados originais. Com 3 PC’s quase 90% da informação original dos dados é representada.

pr.out <- prcomp(select(data, arg, sen, val, pre, mod), scale = FALSE)

tidy(pr.out, "pcs") %>% 
    ggplot(aes(x = PC, y = cumulative)) + 
    geom_line(color = "blue") + 
    geom_point(color = "red") + 
    labs(x = "PCA's", 
         y = "Percentual de Representatividade")

Interpretando os resultados

Os vetores mostram a relação entre PC1, PC2 e as variáveis. O alinhamento entre os vetores arg e o eixo PC1 indica que as variáveis geratrizes deste vetore variam bastante para pontos que estão mais a esquerda ou a direita do gráfico. Ou seja, o eixo PC1 arg, quanto mais a esquerda o ponto estiver menor são seus valores para arg, quanto mais a direita maior serão esses valores.

autoplot(pr.out, data = data, size = 1,
         loadings = TRUE, loadings.colour = 'blue',
         loadings.label = TRUE, 
         loadings.label.size = 6 )

Existe correlação entre as dimenssões de subjetividade?

Análise das distribuição das dimenssões por par

data %>% 
    filter() %>%
    select(arg, sen, val, pre, mod) %>% 
    ggpairs()

Análise das relações entre as dimenssões

    plot_ly(type = 'parcoords',
            lline = list(color = ~data$section,
                      colorscale = 'Jet',
                      showscale = TRUE,
                      reversescale = TRUE,
                      cmin = -4000,
                      cmax = -100),
            dimensions = list(
                list(label = 'Arumentação', values = ~data$arg),
                list(label = 'Sentimento', values = ~data$sen),
                list(label = 'Valoração', values = ~data$val),
                list(label = 'Moduralização', values = ~data$mod),
                list(label = 'Preposição', values = ~data$pre)
            )
    )

É possível determinar grupos para classificar as notícias?

Definindo os cluters

Pode-se definir o número de clusters do agrupamento, por meio do calculo da distância quadrática entre o centro dos clusters, o centro dos dados e os dados. Aqui o centro dos dados é um ponto imaginário na média de todas as variáveis. O gráfico relaciona as variáveis betweenss e totss, essa proporção pode ser usada para definir um bom valor para o número de clusters. Quando a proporção para de crescer significativamente, aumentar os clusters não resulta numa melhor classificação. Neste caso, um bom valor para o número de clustersseria 4.

set.seed(123)
explorando_clusters = tibble(clusters = 1:15) %>% 
    group_by(clusters) %>% 
    do(
        kmeans(select(data, arg, sen, val, pre, mod), 
               centers = .$clusters, 
               nstart = 20) %>% glance()
    )

explorando_clusters %>% 
    ggplot(aes(x = clusters, y = betweenss / totss)) + 
    geom_line(color = "blue") + 
    geom_point(color = "red")

Interpretando os clusters

O método de clustering utilizado foi o k- means, por meio da análise dos agrupos podemos classificar os clusters. O cluter 1 corresponde as notícias com menos viés de subjetividade, pois é o grupo que apresenta menor valor nas dimenssões. O cluter 3 pode ser considerado o menos enviesado, por apresentar notícias com os maiores valores dimensionais.

set.seed(123)

n_clusters = 4

km = select(data, arg, sen, val, pre, mod) %>% 
    kmeans(centers = n_clusters, nstart = 20)

dados.long = km %>% 
    augment(data) %>% 
    gather(key = "dimensão", 
           value = "valor", 
           arg, sen, val, pre, mod) 

autoplot(km, data = data, label = TRUE)

dados.long %>% 
    ggplot(aes(x = `dimensão`, y = valor, group = section, colour = .cluster)) + 
    geom_point(alpha = 0.2) + 
    geom_line(alpha = .5) + 
    facet_wrap(~ paste("Cluster ",.cluster)) 

Relação das dimenssões por cluster

km %>% 
    augment(data) %>%
    plot_ly(type = 'parcoords',
            line = list(colour = ~.cluster),
            dimensions = list(
                list(label = 'Argumentação', values = ~arg),
                list(label = 'Sentimento', values = ~sen),
                list(label = 'Valoração', values = ~val),
                list(label = 'Moduralização', values = ~mod),
                list(label = 'Preposição', values = ~pre)
            )
    )

Como é a distribuição das dimenssões

select(data, section, arg, sen, val, pre, mod) %>%
  ggplot(aes(x = "'", y = arg)) + 
      geom_boxplot(width = .2, outlier.colour = NA, coef = 1000)

select(data, section, arg, sen, val, pre, mod) %>%
  ggplot(aes(x = "", y = sen)) + 
      geom_boxplot(width = .2, outlier.colour = NA, coef = 1000)

 select(data, section, arg, sen, val, pre, mod) %>%
  ggplot(aes(x = "", y = val)) + 
      geom_boxplot(width = .2, outlier.colour = NA, coef = 1000)

 select(data, section, arg, sen, val, pre, mod) %>%
  ggplot(aes(x = "", y = pre)) + 
      geom_boxplot(width = .2, outlier.colour = NA, coef = 1000)

 select(data, section, arg, sen, val, pre, mod) %>%
  ggplot(aes(x = "", y = mod)) + 
      geom_boxplot(width = .2, outlier.colour = NA, coef = 1000)